home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / gui / skin / skintree.pyo (.txt) < prev   
Python Compiled Bytecode  |  2008-10-13  |  12KB  |  397 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from __future__ import with_statement
  5. SKIN_FILENAME = 'skin.yaml'
  6. VARIANT_DIR = 'Variants'
  7. SKIN_NAME_KEY = 'name'
  8. VARIANT_NAME_KEY = 'variant'
  9. alternating_keys = [
  10.     'buddiespanel.backgrounds.buddy',
  11.     'filetransfers.backgrounds.normal']
  12. FONT_MULTIPLY_KEY = 'FontPlatform'
  13. FONT_MULTIPLY = {
  14.     'windows_mac': 4 / 3,
  15.     'mac_windows': 3 / 4 }
  16. __metaclass__ = type
  17. from operator import isMappingType
  18. from util import Storage as S
  19. from path import path
  20. from copy import deepcopy
  21. import syck
  22. import sys
  23. import os
  24. import wx
  25. from wx import GetTopLevelWindows, GetApp, MessageBox, StandardPaths
  26. from traceback import print_exc
  27. from gui.toolbox import colorfor
  28. from types import FunctionType
  29. from util.merge import merge, merge_keys, tolower
  30. from util import syck_error_message, funcinfo
  31. from gui.skin.skintransform import transform
  32. from gui.skin import SkinException
  33. from peak.util.plugins import Hook
  34. from logging import getLogger
  35. log = getLogger('skin')
  36. info = log.info
  37. activeTree = None
  38. resource_paths = [
  39.     path('res').abspath(),
  40.     path('res/skins/default').abspath()]
  41.  
  42. def get(dottedpath, default = sentinel):
  43.     
  44.     try:
  45.         return lookup(activeTree, dottedpath.lower().split('.'))
  46.     except (KeyError, TypeError):
  47.         if default is sentinel:
  48.             raise SkinException('not found: ' + dottedpath)
  49.         else:
  50.             return default
  51.     except:
  52.         default is sentinel
  53.         print_exc()
  54.         print >>sys.stderr, 'exception for "%s"' % dottedpath
  55.  
  56.  
  57.  
  58. def refresh_wx_tree():
  59.     UMenu = UMenu
  60.     import gui.uberwidgets.umenu
  61.     skip = (UMenu,)
  62.     for window in GetTopLevelWindows():
  63.         window.FrozenQuick().__enter__()
  64.         
  65.         try:
  66.             _updateskin(window, skip)
  67.         finally:
  68.             pass
  69.  
  70.     
  71.     UMenu.CallAll(UMenu.UpdateSkin)
  72.  
  73.  
  74. def _updateskin(window, skip):
  75.     
  76.     try:
  77.         update = window.UpdateSkin
  78.     except AttributeError:
  79.         pass
  80.  
  81.     if not isinstance(window, skip):
  82.         
  83.         try:
  84.             update()
  85.         print_exc()
  86.  
  87.     
  88.     for c in window.Children:
  89.         _updateskin(c, skip)
  90.     
  91.  
  92.  
  93. def alternating(tree):
  94.     SkinList = SkinList
  95.     import gui.skin.skinobjects
  96.     for k in alternating_keys:
  97.         spath = k.split('.')
  98.         
  99.         try:
  100.             val = lookup(tree, spath)
  101.         except AttributeError:
  102.             continue
  103.  
  104.         if isinstance(val, list):
  105.             lookup(tree, spath[:-1])[spath[-1]] = SkinList(val)
  106.             continue
  107.     
  108.  
  109.  
  110. def fontplatform(finaltree):
  111.     skin = skin
  112.     import gui
  113.     platformName = platformName
  114.     import config
  115.     platform_aliases = {
  116.         'win': 'windows',
  117.         'mac': 'mac' }
  118.     fontplatform = finaltree.get(FONT_MULTIPLY_KEY.lower(), None)
  119.     fp = '%s_%s' % (fontplatform, platform_aliases.get(platformName))
  120.     factor = FONT_MULTIPLY.get(fp, 1)
  121.     log.info('new font multiply factor: %s -> %s', fp, factor)
  122.     skin.font_multiply_factor = factor
  123.  
  124. pretransforms = [
  125.     fontplatform]
  126. posttransforms = [
  127.     alternating]
  128.  
  129. def set_active(skin, variant = None, update_gui = False, callback = None):
  130.     global activeTree
  131.     log.info('set_active(%s, %s)', skin, variant)
  132.     app = GetApp()
  133.     skin = resource_paths[0] / path('skins') / skin
  134.     if variant is not None:
  135.         variant = skin / VARIANT_DIR / variant + '.yaml'
  136.     
  137.     skinpath = skin / SKIN_FILENAME
  138.     default_path = resource_paths[0] / 'skins' / 'default' / SKIN_FILENAME
  139.     paths = [
  140.         default_path]
  141.     if not skinpath.exists():
  142.         log.critical('cannot find %s (%r.exists() == False, defaulting to silverblue', skin, skinpath)
  143.         skin = resource_paths[0] / path('skins') / 'silverblue'
  144.         skinpath = skin / SKIN_FILENAME
  145.         variant = None
  146.     
  147.     if default_path.abspath() != skinpath.abspath():
  148.         paths.append(skinpath)
  149.     
  150.     if variant is not None and variant.exists():
  151.         paths.append(variant)
  152.     else:
  153.         log.warning('cannot find variant %s for skin %s', variant, skin)
  154.     if not update_gui and hasattr(app, 'skin') and app.skin.paths == paths:
  155.         log.info('skin did not change, returning')
  156.     
  157.     log.info('loading YAML from %d path(s):\n  %s', len(paths), '\n  '.join(paths))
  158.     trees = get_skintrees(skin, paths)
  159.     default_tree = deepcopy(trees[0])
  160.     combined_tree = merge(*trees, **dict(keytransform = (lambda k: getattr(k, 'lower', (lambda k: k))()
  161. )))
  162.     if not hasattr(app, 'skin'):
  163.         app.skin = S()
  164.     
  165.     app.skin.update(path = skinpath.parent, paths = get_image_load_paths(paths))
  166.     for pretransform in pretransforms:
  167.         pretransform(combined_tree)
  168.     
  169.     
  170.     try:
  171.         finaltree = transform(combined_tree)
  172.     except Exception:
  173.         e = None
  174.         MessageBox('There was an error processing skin "%s":\n\n%s' % (skin, str(e)), 'Skin Error')
  175.         print_exc()
  176.         finaltree = transform(default_tree)
  177.  
  178.     for posttransform in posttransforms:
  179.         posttransform(finaltree)
  180.     
  181.     activeTree = finaltree
  182.     app.skin.update(tree = finaltree)
  183.     
  184.     def done():
  185.         if update_gui:
  186.             refresh_wx_tree()
  187.         
  188.         if callback is not None:
  189.             callback()
  190.         
  191.  
  192.     wx.CallAfter(done)
  193.     return app.skin
  194.  
  195.  
  196. def list_skins():
  197.     resource_paths = sys.modules['gui.skin.skintree'].resource_paths
  198.     skins = []
  199.     for res in resource_paths:
  200.         skinrootdir = res / 'skins'
  201.         if skinrootdir.exists():
  202.             for skindir in skinrootdir.dirs():
  203.                 if skindir.name.startswith('.'):
  204.                     continue
  205.                 
  206.                 rootfile = skindir / SKIN_FILENAME
  207.                 if rootfile.exists() and skindir.name != 'default':
  208.                     skins.append(skindesc(rootfile))
  209.                     continue
  210.             
  211.     
  212.     return skins
  213.  
  214.  
  215. def get_skintrees(skin, paths):
  216.     trees = []
  217.     for f in paths:
  218.         
  219.         try:
  220.             trees.append(load_skinfile(f))
  221.         continue
  222.         except Exception:
  223.             e = None
  224.             MessageBox('There was an error loading skin "%s":\n\n%s' % (skin, str(e)), 'Skin Error')
  225.             continue
  226.         
  227.  
  228.     
  229.     for hook in Hook('digsby.skin.load.trees'):
  230.         hook_trees = hook()
  231.         if hook_trees is not None:
  232.             trees.extend(hook_trees)
  233.             continue
  234.         None<EXCEPTION MATCH>Exception
  235.     
  236.     return trees
  237.  
  238.  
  239. def get_image_load_paths(paths):
  240.     image_load_paths = [ p.parent for p in paths ]
  241.     for pathhook in Hook('digsby.skin.load.skinpaths'):
  242.         hook_paths = pathhook()
  243.         if hook_paths is not None:
  244.             image_load_paths.extend(hook_paths)
  245.             continue
  246.         []
  247.     
  248.     return image_load_paths
  249.  
  250.  
  251. def quick_name_lookup(p, **names):
  252.     names = dict((lambda .0: for key, name in .0:
  253. (name.lower(), key))(names.iteritems()))
  254.     vals = { }
  255.     
  256.     try:
  257.         f = _[2]
  258.         s = syck.load(f)
  259.         print type(s)
  260.         for k, name in getattr(s, ('iteritems',), (lambda : s))():
  261.             
  262.             try:
  263.                 k = k.lower()
  264.             except AttributeError:
  265.                 continue
  266.  
  267.             if k in names and isinstance(name, basestring):
  268.                 vals[k] = name
  269.                 if len(vals) == len(names):
  270.                     break
  271.                 
  272.             len(vals) == len(names)
  273.     finally:
  274.         pass
  275.  
  276.     return vals
  277.  
  278.  
  279. def skindesc(rootfile):
  280.     rootfile = path(rootfile)
  281.     aliases = quick_name_lookup(rootfile, skin_alias = SKIN_NAME_KEY, novariant_alias = VARIANT_NAME_KEY)
  282.     variants = []
  283.     vardir = rootfile.parent / VARIANT_DIR
  284.     if vardir.exists():
  285.         for variant in vardir.files('*.yaml'):
  286.             if variant != rootfile:
  287.                 valias = quick_name_lookup(variant, variant_alias = VARIANT_NAME_KEY).get('variant_alias', variant.namebase)
  288.                 variants.append(S(path = variant, alias = valias))
  289.                 continue
  290.         
  291.     
  292.     return S(name = rootfile.parent.name, alias = aliases.get(SKIN_NAME_KEY, rootfile.parent.name), novariant_alias = aliases.get(VARIANT_NAME_KEY, _('(none)')), base = rootfile, variants = variants)
  293.  
  294.  
  295. def lookup(root, pathseq):
  296.     elem = root
  297.     for p in pathseq:
  298.         elem = elem[p]
  299.     
  300.     return elem
  301.  
  302.  
  303. def load_skinfile(filepath):
  304.     if not filepath.exists():
  305.         raise ValueError('file %s does not exist' % filepath)
  306.     
  307.     return globals()['load_%s' % filepath.ext[1:]](filepath)
  308.  
  309.  
  310. def load_yaml(str_or_path):
  311.     (bytes, fpath) = getcontent(str_or_path)
  312.     if isinstance(bytes, unicode):
  313.         bytes = bytes.encode('utf-8')
  314.     
  315.     if not bytes:
  316.         raise SkinException('no bytes in ' + str_or_path)
  317.     
  318.     content = load_yaml_content(bytes)
  319.     
  320.     try:
  321.         root = syck.load(content)
  322.     except syck.error:
  323.         e = None
  324.         raise SkinException(syck_error_message(e, fpath))
  325.  
  326.     return merge_keys(root)
  327.  
  328.  
  329. def load_yaml_content(bytes, included_paths = None):
  330.     if included_paths is None:
  331.         included_paths = []
  332.     
  333.     lines = []
  334.     for line in bytes.split('\n'):
  335.         if line.lower().startswith('include:'):
  336.             include_path = line[line.index(':') + 1:].strip()
  337.             line = load_yaml_include(include_path, included_paths)
  338.         
  339.         lines.append(line)
  340.     
  341.     return '\n'.join(lines)
  342.  
  343.  
  344. def load_yaml_include(incpath, included_paths):
  345.     incpath = path(incpath).abspath()
  346.     if incpath not in included_paths:
  347.         bytes = load_yaml_content(incpath.bytes(), included_paths)
  348.         included_paths += [
  349.             incpath]
  350.         return bytes
  351.     else:
  352.         return ''
  353.  
  354. from util.data_importer import zipopen
  355. from contextlib import closing
  356.  
  357. def getcontent(str_or_path):
  358.     
  359.     try:
  360.         if str_or_path.exists():
  361.             return (str_or_path.bytes(), str_or_path)
  362.         
  363.         
  364.         try:
  365.             f = _[2]
  366.             return (f.read(), str_or_path)
  367.         finally:
  368.             pass
  369.  
  370.     except AttributeError:
  371.         return (str_or_path, '<String Input>')
  372.  
  373.  
  374. if __name__ == '__main__':
  375.     s = 'common:\n- &mycolor red\n\nmenu:\n  color: *mycolor\n\ncommon:\n- &mycolor blue'
  376.     print load_yaml(s)
  377.  
  378. if __name__ == '_AFDASF':
  379.     import wx
  380.     a = wx.PySimpleApp()
  381.     sys.modules['gui.skin.skintree'].resource_paths = [
  382.         path('../../../res')]
  383.     skins = list_skins()
  384.     if not skins:
  385.         sys.exit()
  386.     
  387.     set_active(skins[1])
  388.     
  389.     try:
  390.         f = _[2]
  391.         f.write('button:\n    color: red')
  392.     finally:
  393.         pass
  394.  
  395.     s = '\ninclude: test.yaml\ninclude: test.yaml\n\nButton:\n    font: Arial\n\nbutton:\n    Font: Comic Sans MS\n'
  396.  
  397.